/**
 * Excel服务
 * 用于处理Excel文件的导入和导出
 */
import * as XLSX from 'xlsx';
import { saveAs } from 'file-saver';
import logger from './Logger';

class ExcelService {
  /**
   * 将数据导出为Excel文件
   * @param {Array} data - 要导出的数据
   * @param {string} fileName - 文件名
   * @param {string} sheetName - 工作表名
   */
  static exportToExcel(data, fileName, sheetName = 'Sheet1') {
    try {
      // 创建工作簿
      const workbook = XLSX.utils.book_new();
      
      // 创建工作表
      const worksheet = XLSX.utils.json_to_sheet(data);
      
      // 将工作表添加到工作簿
      XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
      
      // 生成Excel文件的二进制数据
      const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
      
      // 创建Blob对象
      const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
      
      // 保存文件
      saveAs(blob, `${fileName}.xlsx`);
      
      logger.info(`成功导出Excel文件: ${fileName}.xlsx`, { rows: data.length });
      return true;
    } catch (error) {
      logger.error('导出Excel文件失败', error);
      throw error;
    }
  }

  /**
   * 将数据导出为CSV文件
   * @param {Array} data - 要导出的数据
   * @param {string} fileName - 文件名
   */
  static exportToCSV(data, fileName) {
    try {
      // 获取所有列名
      const headers = Object.keys(data[0]);
      
      // 创建CSV内容
      let csvContent = headers.join(',') + '\n';
      
      // 添加数据行
      for (const row of data) {
        const values = headers.map(header => {
          const value = row[header] || '';
          // 如果值包含逗号、引号或换行符，则用引号包裹
          return /[",\n]/.test(value) ? `"${value.replace(/"/g, '""')}"` : value;
        });
        csvContent += values.join(',') + '\n';
      }
      
      // 创建Blob对象
      const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' });
      
      // 保存文件
      saveAs(blob, `${fileName}.csv`);
      
      logger.info(`成功导出CSV文件: ${fileName}.csv`, { rows: data.length });
      return true;
    } catch (error) {
      logger.error('导出CSV文件失败', error);
      throw error;
    }
  }

  /**
   * 解析学生名单Excel文件
   * @param {File} file - Excel文件
   * @returns {Promise<Array>} 学生数据数组
   */
  static parseStudentList(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      
      reader.onload = (e) => {
        try {
          const data = new Uint8Array(e.target.result);
          const workbook = XLSX.read(data, { type: 'array' });
          
          // 获取第一个工作表
          const firstSheetName = workbook.SheetNames[0];
          const worksheet = workbook.Sheets[firstSheetName];
          
          // 将工作表转换为JSON
          const jsonData = XLSX.utils.sheet_to_json(worksheet);
          
          // 验证和转换数据
          const students = jsonData.map((row, index) => {
            // 检查必要字段
            if (!row['学号'] || !row['姓名']) {
              throw new Error(`第 ${index + 2} 行数据缺少必要字段: 学号或姓名`);
            }
            
            return {
              id: `student_${Date.now()}_${index}`, // 生成唯一ID
              studentId: row['学号'].toString(),
              name: row['姓名'],
              grade: row['年级'] || '',
              major: row['专业'] || ''
            };
          });
          
          logger.info('成功解析学生名单', { count: students.length });
          resolve(students);
        } catch (error) {
          logger.error('解析学生名单失败', error);
          reject(error);
        }
      };
      
      reader.onerror = (error) => {
        logger.error('读取Excel文件失败', error);
        reject(error);
      };
      
      reader.readAsArrayBuffer(file);
    });
  }
}

export default ExcelService;
